/*
 * AbstractTopologicalSorter.java - Copyright May 14, 2012 Z Networks Group, Inc. All rights reserved.
 * Z Networks Group PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.andromeda.util.dependency;

import java.util.HashSet;
import java.util.Set;

/**
 * Contiene algunos métodos útiles para la implementación de un ordenador
 * topológico.
 *
 * @author Dickinson Roman Arismendy Torres
 */
public abstract class AbstractTopologicalSorter implements TopologicalSorter {

    /**
     * Obtiene la lista de nodos que no tienen nodos dependientes, es decir
     * aquellos de los cuales no depende otro nodo.
     *
     * @param nodes
     * @return
     */
    protected Set<Dependent> findLastDependents(Set<? extends Dependent> nodes) {
        Set<Dependent> lastDependents = new HashSet<Dependent>();
        for (Dependent node : nodes) {
            if (getDependents(node, nodes).isEmpty()) {
                lastDependents.add(node);
            }
        }
        return lastDependents;
    }

    /**
     * Obtiene el conjunto de nodos que dependen del nodo dado dentro de los
     * nodos dados.
     *
     * @param node el nodo del cual se buscan los nodos dependientes.
     * @param allNodes los nodos entre los cuales se buscan los dependientes.
     * @return un conjunto no nulo.
     */
    protected Set<Dependent> getDependents(Dependent node, Set<? extends Dependent> allNodes) {
        Set<Dependent> dependents = new HashSet<Dependent>();
        for (Dependent nd : allNodes) {
            if (nd.getDependencies().contains(node)) {
                dependents.add(nd);
            }
        }
        return dependents;
    }

    /**
     * Busca los nodos que no dependen de ningún otro nodo.
     *
     * @param nodes el conjunto de nodos en los cuales se hará la búsqueda.
     * @return
     */
    protected Set<Dependent> findFirstDependents(Set<? extends Dependent> nodes) {
        Set<Dependent> firstDependents = new HashSet<Dependent>();
        for (Dependent node : nodes) {
            if (node.getDependencies() == null || node.getDependencies().isEmpty()) {
                firstDependents.add(node);
            }
        }
        return firstDependents;
    }
}
